<?php
class SzamlaSzamSQL{

/* A szamlaTartomany stringet átkódolja SQL utasítássá
 * @param string $szamlaTartomany a tartomány string a következők szerint:
 * 		a szamlaTartomany param lehetséges formái és átalakításuk
 *			91*				type = LEFT: LEFT(szamlak.szam, 2) = "91"
 *								type = BETWEEN: szamlak.szam BETWEEN "2" AND "29999999999"
 *			96*+99*			LEFT(szamlak.szam, 2) = "96" OR LEFT(szamlak.szam, 2) = "99"
 *			9*-96*			szamlak.szam BETWEEN "9" AND "969999999"
 *			9*-96*+99*		szamlak.szam BETWEEN "9" AND "969999999" OR LEFT(szamlak.szam, 2) = "99"
 *			5*-59*!52*		szamlak.szam BETWEEN "5" AND "599999999" AND (LEFT(szamlak.szam, 2) != "52")
 *	@param string $type az addLeft típusa, lehet between vagy left
 *	@example SzamlaSzamSQL->createSzamlaTartomanySql('1*+23*+3*'); return: 'LEFT(szamlak.szam, 1) = "1" OR LEFT(szamlak.szam, 2) = "23" OR LEFT(szamlak.szam, 1) = "3"'
 *	@return string az SQL-é alakított forma
*/	
	
	private $type = null;
	private $n = 9999999999;
	
	public function createSzamlaTartomanySql($szamlaTartomany, $type = 'between'){
		$this->type = $type;
		//először is csapjuk ketté a stringet a ! mentén, már ha van
		$szamlaTartomanyok = explode('!', $szamlaTartomany);
		$r = isset($szamlaTartomanyok[1]) 
							? '(' . $this->createSzamlaTartomanySqlAnalize($szamlaTartomanyok[0]) . ') AND (' . $this->createSzamlaTartomanySqlAnalize($szamlaTartomanyok[1], true) . ')'
							: $this->createSzamlaTartomanySqlAnalize($szamlaTartomanyok[0]);
		return $r;
	}
	
	private function createSzamlaTartomanySqlAnalize($szamlaTartomany, $negalas = false){
		$szamlaTartomany = str_replace('*', '', $szamlaTartomany);
		if(!strpos($szamlaTartomany, '+') && !strpos($szamlaTartomany, '-')){
			return $this->csakSzamForSql($szamlaTartomany, $negalas);
		}
		elseif(strpos($szamlaTartomany, '+') && !strpos($szamlaTartomany, '-')){
			return $this->csakPluszForSql($szamlaTartomany, $negalas);
		}
		elseif(strpos($szamlaTartomany, '-') && !strpos($szamlaTartomany, '+')){
			return $this->csakMinuszForSql($szamlaTartomany, $negalas);
		}
		else{		//van + és - is		1*-2*+3*-4*+5*
			$reszek = explode('+', $szamlaTartomany);
			$r = '';
			foreach($reszek as $i => $resz){
				if($negalas)
					$r .= ($i > 0) ? ' AND ' : '';
				else
					$r .= ($i > 0) ? ' OR ' : '';
				if(!strpos($resz, '-')){
					$r .= $this->csakPluszForSql($resz, $negalas);
				}
				else{
					$r .= $this->csakMinuszForSql($resz, $negalas);
				}
			}
			return $r;
		}
		return false;
	}
	
	private function csakSzamForSql($szam, $negalas){
		return $this->addLeftForSql($szam, $negalas);
	}

	private function csakPluszForSql($szam, $negalas){
		$szamok = explode('+', $szam);
		$r = '';
		$l = count($szamok)-1;
		foreach($szamok as $i => $sz){
			$r .= $this->addLeftForSql($sz, $negalas);
			if($i < $l){
				if($negalas)
					$r .= ' AND ';
				else
					$r .= ' OR ';
			}
		}
		return $r;
	}

	private function csakMinuszForSql($szam, $negalas){
		return $this->addBetweenForSql(explode('-', $szam), $negalas);
	}

	private function addLeftForSql($szam, $negalas){
		if($this->type == 'left'){
			if($negalas)
				return 'LEFT(szamlak.szam, '.strlen($szam).') != "'.$szam.'"';
			else
				return 'LEFT(szamlak.szam, '.strlen($szam).') = "'.$szam.'"';
		}
		else{		//between
			if($negalas)
				return 'szamlak.szam NOT BETWEEN "'.$szam.'" AND "' . $szam . $this->n . '"';
			else
				return 'szamlak.szam BETWEEN "'.$szam.'" AND "' . $szam . $this->n . '"';
		}
	}

	private function addBetweenForSql($szamok, $negalas){
		if($negalas)
			return 'szamlak.szam NOT BETWEEN "' . $szamok[0] . '" AND "' . $szamok[1] . $this->n .'"';
		else
			return 'szamlak.szam BETWEEN "' . $szamok[0] . '" AND "' . $szamok[1] . $this->n . '"';
	}
	
}
?>